package com.bnz.listener;

import com.bnz.entity.Product;

import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.Map;

/**
 * Application监听器（Application全局的，程序一启动就调用）
 */
@WebListener
public class MyApplicationListener implements ServletContextListener, ServletContextAttributeListener {
    /**
     * 1-2方法,是Application对象的监控
     * @param sce
     */

    // 将超市中的所有商品都放进此监听器的作用域中

    // 1、Application对象的初始化
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("(Application)对象初始化");
        // 1.1、创建一个集合，用于存放商品(k:integer,v:product(商品实体类))
        Map<Integer, Product> map = new HashMap<>();
        // k:1001,v:创建新商品实体类对象，存储数据
        map.put(1001,new Product(1001,"洗发水",25,200));
        map.put(1002,new Product(1002,"沐浴露",35,150));
        map.put(1003,new Product(1003,"苹果",10,300));
        map.put(1004,new Product(1004,"牙膏",15,500));
        map.put(1005,new Product(1005,"可乐",3,1000));
        map.put(1006,new Product(1006,"花生",6,700));
        map.put(1007,new Product(1007,"雪糕",30,300));
        map.put(1008,new Product(1008,"橙汁",5,8000));
        // 2.2、下面两步是将map中的数据放进作用域中(放进之后，可以在页面拿到值)
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("products",map);
    }

    // 2、Application对象的销毁
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("(Application)对象的销毁");
    }

    /**
     * 3-5方法吗，是Application属性的监控
     * @param event
     */
    // 3、Application属性的添加
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("(Application)属性的添加");
    }

    // 4、Application属性的移除
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("(Application)属性的移除");
    }

    // 5、Application属性的替换
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("(Application)属性的替换");
    }

}
